package com.lmf.annotation.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

//

/**
 *  (1)默认加在IOC容器中的组件，容器启动会调用无参构造器创建对象，然后再进行初始化、赋值等操作
 *  (2)使用@Autowired注解标注在构造方法上时，容器启动会调用当前参数构造器来创建对象，构造方法中的参数对象也是从IOC容器中获取的。
 *  (3)使用@Autowired注解标注在构造方法上时，如果组件中只有一个有参构造方法，
 *    那么这个有参构造方法上的@Autowired注解可以省略，并且参数位置的组件还是可以自动从IOC容器中获取。
 */
@Repository
public class MyDao {

    private MyDao_2 myDao_2; //要使用已经注册在容器的对象作为参数，否则会报错

    public MyDao() {
        System.out.println("mydao类被无参构造方法创建。。。。。。。。。。。");
    }

    //将@Autowired 标注在构造方法上面：指定使用哪个构造方法来，创建对象
//    @Autowired
//    public MyDao(MyDao_2 myDao_2) {
//        this.myDao_2 = myDao_2;
//        System.out.println("mydao类被有参构造方法创建。。。。。。。。。。。");
//    }

    public MyDao_2 getMyDao_2() {
        return myDao_2;
    }

    //将@Autowired 标注在setter方法上面：创建对象时，调用该方法进行赋值; 否则就要等设置参数时，才会调用
    @Autowired
    public void setMyDao_2(MyDao_2 myDao_2) {
        System.out.println("创建MyDao对象时，调用该setter方法进行赋值");
        this.myDao_2 = myDao_2;
    }


    @Override
    public String toString() {
        return "MyDao{" +
                "myDao_2=" + myDao_2 +
                '}';
    }
}
